//============================================================================================
/**
 * @file	phc_svdata.h
 * @brief   PHCセーブデータアクセス処理ヘッダ
 * @date	2009.01.31
 * @author	AkitoMori GameFreak inc.
 */
//============================================================================================

#ifndef	__PHC_SVDATA_H__
#define	__PHC_SVDATA_H__

#include "savedata/savedata_def.h"
#include "phc/phc_struct.h"
#include "gflib/gf_date.h"


enum{
	PHC_NO_PLUG=0,		///< PHCと紐つけしてない
	PHC_NO_DEPSIT,		///< PHCに預けていない
	PHC_DEPOSIT,		///< PHCに預けている
};

///< PHCの配布マップデータの総数
#define PHC_MAP_NUM				(  10 )

///< PHCに格納するIDの総バイト数
#define PHC_UNIQUE_ID_SIZE		(  40 )

///< Wifi交換（GTS・直接通信）でオープンになるPHCのコースNO
#define PHC_WIFI_OPEN_COURSE_NO	(  20 )

///< ジラーチを手に入れた時にオープンするコースのNO
#define PHC_JIRACHI_COURSE_NO	(  21 )

///< 「ふしぎなおくりもの」で増やせるコースのスタートNO
#define PHC_FUSHIGI_COURSE_NO	( 22 )

///< 「ふしぎなおくりもの」で増やせるコースの数
#define PHC_FUSHIGI_COURSE_NUM	(  5 )

///< 計算上手に入れられるワットの最大値
#define PHC_WAT_MAX				( 9999999 )


typedef struct{
  u16	id;				// ポケモンの種類
  u16	item;			// 保持アイテム
  u16	skill[4];		// 技リスト
  u8	level;			// レベル

  u8	folm:5;			// フォルムナンバー
  u8	sex:2;			// 性別
  u8	isEgg:1;		// タマゴフラグ

  u8	reverseFlag:1;	// 反転フラグ
  u8	rareColor:1;	// レアカラー
  u8	padding[1];

}PHC_MAP_POKEMON;


typedef struct{
  u16 pokeStep;			// 配布ポケモン出現歩数
   u8 pokeRate;			// 配布ポケモン出現確率
   u8 padding[1];
}PHC_POKEMON_CONDITION; // 取得条件

typedef struct{
	u16 ItemStep;
	u16 Item;
	u8  ItemProbability;
}PHC_MAP_ITEM;



typedef struct PHC_MAP_DATA_tag{
	u8	country;
	u8	romVersion;
	u8  mapId;
	u8	courseId;

	u8	 RomCode;		// ROMバージョン
	u8   Region;		// 言語コード

	u8   CourseBgId;	// コース背景ID
	u8   CourseId;		// コースID


	STRCODE  CourseName[11];	// コース名（DS内でのみ使用）
	u16		 Item[3];

	u8		PokeLevel[3];

	PHC_MAP_POKEMON	MapPoke[6];
	PHC_POKEMON_CONDITION PokeCond[6];
	PHC_MAP_ITEM	MapItem[10];
	u8 profitable[3];
}PHC_MAP_DATA;




//----------------------------------------------------------
/**
 * @brief	PHC_SVDATA への不完全型定義
 */
//----------------------------------------------------------
typedef struct PHC_SVDATA PHC_SVDATA;

//PHCセーブデータの取得
extern PHC_SVDATA * SaveData_GetPhcSaveData( SAVEDATA * sv );

// PHCセーブデータの初期化
extern void PhcSvData_Init( PHC_SVDATA *sv );
// PHC接続画面で行うセーブデータの初期化（コースデータが消えないVER.）
extern void PhcSvData_Clear( PHC_SVDATA *sv );


extern int PhcSvData_GetWorkSize(void);

// PHCにポケモンを預けた日を取得
extern GF_DATE PhcSvData_GetPhcDepositDate( PHC_SVDATA *sv );

// PHCにポケモンを預けた日をセット
extern void PhcSvData_SetPhcDepositDate( PHC_SVDATA *sv, GF_DATE date );

// PHCにポケモンを預けた回数を取得
extern int PhcSvData_GetPhcDepositNum( PHC_SVDATA *sv );

// PHCにポケモンを預けた回数をセット
extern void PhcSvData_IncPhcDepositNum( PHC_SVDATA *sv );

// PHCと交信した最終日を設定
extern void PhcSvData_SetPhcConnectDate( PHC_SVDATA *sv, GF_DATE date );
// PHCと交信した最終日を取得
extern GF_DATE PhcSvData_GetPhcConnectDate( PHC_SVDATA *sv );

// 現在PHCに預けているかの情報を取得
extern void PhcSvData_GetDepositInfo( PHC_SVDATA *sv, u16 *flag, u16 *box );


// 現在PHCに預けた情報をセット
extern void PhcSvData_SetDepositInfo( PHC_SVDATA *sv, int flag , int box );

// PHCに預けたポケモンを保存
extern void PhcSvData_SetPokemon( PHC_SVDATA *sv, const u8 *buf );
// PHCに預けたポケモンをセーブデータから取り出し(復活させるため）
extern int PhcSvData_GetPokemon( PHC_SVDATA *sv, u8 *buf );
// セーブデータに隠してあるポケモンのデータ領域をクリアする
extern void PhcSvData_ClearPokemon( PHC_SVDATA *sv );


// 総歩数と総ワット数をセット
extern void PhcSvData_SetTotalStepWat( PHC_SVDATA *sv, const u32 step, const u32 wat );
// 総歩数と総ワット数を取得
extern void PhcSvData_GetTotalStepWat( PHC_SVDATA *sv, u32 *step, u32 *wat );

// PHC-IDの配列のポインタを取得
extern u8* PhcSvData_GetIdPtr( PHC_SVDATA *sv );

// 最後にＰＨＣに送信したコースＩＤを取得
extern int PhcSvData_GetLastCourse( PHC_SVDATA *sv );
// 最後にＰＨＣに送信したコースＩＤを設定
extern void PhcSvData_SettLastCourse( PHC_SVDATA *sv, int course );

// 指定のコースオープンフラグを設定
extern void PhcSvData_SetCourseOpenFlag( PHC_SVDATA *sv, int course_no );
// 指定のコースオープンフラグを取得
extern  int PhcSvData_GetCourseOpenFlag( PHC_SVDATA *sv, int course_no );

// エンディングフラグの取得
extern void PhcSvData_SetEndingFlag( PHC_SVDATA *sv );
// エンディングフラグを立てる
extern int PhcSvData_GetEndingFlag( PHC_SVDATA *sv );

#ifdef PM_DEBUG
extern  void PhcSvData_InitCourseFlag( PHC_SVDATA *sv );
#endif

#endif	/* __PHC_SVDATA_H__ */
